#include <iostream>
using namespace std;

// struct Stack
// {
//     int* a;
//     int top;
//     int capacity;

//     void Init(int size = 4);

// };

// void Stack::Init(int size)
// {
//     a = (int*)malloc(sizeof(int) * size);
//     top = 0;
//     capacity = 4;
// }


// class Stack
// {
// public:
//     int* a;
//     int top;
//     int capacity;
// public:
//     void Init(int size = 4)
//     {
//         a = (int*)malloc(sizeof(int) * size);
//         if(a == nullptr)
//         {
//             exit(-1);
//         }
//         top = 0;
//         capacity = 4;
//     }

// };

// class Date
// {
// public:
//     void Init(int year,int month,int day)
//     {
//         _year = year;
//         _month = month;
//         _day = day;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };

// template <typename T>
// T Add(T a, T b)
// {
//     return a + b;
// }

// int main()
// {
//     cout << Add(3.1,4.1) << endl;
//     cout << Add<int>(3,4) << endl;
//     // Stack s1;
//     // Stack s2;
//     // s2.Init();
//     // cout << s2.a << endl;
//     // cout << s2.top << endl;
//     // cout << s2.capacity << endl;

//     return 0;
// }



class Date
{
public:
    // Date()
    // {
    //     _year = 1;
    //     _month = 1;
    //     _day = 1;
    // }

    friend ostream& operator<<(ostream& out,Date& d);

    Date(int year = 1,int month = 1,int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }


    bool operator==(Date& d)
    {
        return _year == d._year && _month == d._month && _day == d._day;
    }

    Date& operator=(Date& d)
    {
        if(this != &d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }

    Date& operator++()
    {
        _day++;
        return *this;
    }

    Date operator++(int)
    {
        Date temp = *this;
        _day++;
        return temp;
    }

    // void _init( int year,int month,int day )
    // {
    //     _year = year;
    //     _month = month;
    //     _day = day;
    // }

    void print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

    ~Date()
    {
        _year = 0;
        _month = 0;
        _day = 0;
    }

private:
    int _year;
    int _month;
    int _day;
};

void test(Date d1)
{
    d1.print();
}


ostream& operator<<(ostream& out,Date& d)
{
    out << d._year << "-" << d._month << "-" << d._day;
    return out;
}


int main()
{

    Date d1(2024,2,2);

    cout << d1 << endl;

    // Date* pd = new Date(2023,10,11);

    // pd->print();    



    // Date d1(2024,2,2);
    // Date d2(2024,2,2);
    // cout << (d1 == d2) << endl;
    // d2.print();
    // ++d2;
    // d2.print();
    // Date d3 = d2++;
    // d3.print();
    // d2.print();
    // d1.print();
    // d2.print();
    return 0;
}

